package dao;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

import vo.DetalleTraficoVO;
import vo.EmpresaVO;

import com.sun.org.apache.xerces.internal.impl.dtd.models.CMAny;

import negocio.Campania;
import negocio.Cliente;
import negocio.Cobro;
import negocio.Empresa;
import negocio.Pago;
import entity.CampaniaBD;
import fachade.PrincipalFachade;

public class CampaniaDAO extends DAO{

	public CampaniaBD getCampaniaById(int idCampania) {
		ResultSet rs = super.getObjectById("campania", "id_campania", idCampania);
		CampaniaBD campaniaBD = null;
		try {
			if(rs.next()){
				
				try {
					campaniaBD = new CampaniaBD();
					campaniaBD.setDescripcion(rs.getString("descripcion"));
					campaniaBD.setEmpresa(new EmpresaDAO().getEmpresaById(rs.getInt("id_empresa")));
					campaniaBD.setFecha_alta(rs.getDate("fecha_alta"));
					campaniaBD.setFecha_baja(rs.getDate("fecha_baja"));
					campaniaBD.setId_campania(idCampania);
					campaniaBD.setRevenue_carrier(rs.getFloat("revenue_carrier"));
					campaniaBD.setRevenue_cliente(rs.getFloat("revenue_cliente"));
					campaniaBD.setTipo(rs.getString("tipo"));
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return campaniaBD;
	}

	public List<CampaniaBD> getCampaniasEmpresa(Empresa empresa) throws Exception{
		ResultSet rs = null;
			String query ="";
			if(empresa instanceof Cliente)
				query = "select id_campania,descripcion,campania.fecha_alta,campania.fecha_baja,campania.id_empresa,revenue_carrier,revenue_cliente, tipo  from campania join empresa on empresa.id_empresa = campania.id_empresa where empresa.id_empresa = " + String.valueOf(empresa.getCodigoEmpresa());
			else
				query = "select distinct campania.id_campania,campania.descripcion,campania.fecha_alta,campania.fecha_baja,campania.id_empresa,revenue_carrier,campania.revenue_cliente,campania.tipo  from campania join trafico_numero_corto on trafico_numero_corto.id_campania = campania.id_campania join concepto on concepto.id_concepto = trafico_numero_corto.codigo_concepto where concepto.id_empresa = " + String.valueOf(empresa.getCodigoEmpresa());
			rs = super.executeQuery(query);
			
			List<CampaniaBD> campanias = null;
			
			while(rs.next()){
				if( campanias == null )
					campanias = new LinkedList<CampaniaBD>();
				
				CampaniaBD tmpCampaniaBD = new CampaniaBD();
				
				tmpCampaniaBD.setId_campania(rs.getInt("id_campania"));
				tmpCampaniaBD.setDescripcion(rs.getString("Descripcion"));
				tmpCampaniaBD.setFecha_alta(rs.getDate("fecha_alta"));
				tmpCampaniaBD.setFecha_baja(rs.getDate("fecha_baja"));
				tmpCampaniaBD.setEmpresa(PrincipalFachade.getInstance().getiEmpresaFachade().getEmpresaBDyId(rs.getInt("id_empresa")));
				tmpCampaniaBD.setRevenue_carrier(rs.getFloat("revenue_carrier"));
				tmpCampaniaBD.setRevenue_cliente(rs.getFloat("revenue_cliente"));
				tmpCampaniaBD.setTipo(rs.getString("tipo"));
				campanias.add(tmpCampaniaBD);
				}
			
			return campanias;	
	}
	
	
	public List<CampaniaBD> getCampaniasClientePeriodo(Empresa empresa, int periodo) {
		
		ResultSet rs = null;
		try {
			rs = super.executeQuery(""
					+ "select id_campania,"
					+ "descripcion,"
					+ "campania.fecha_alta,"
					+ "campania.fecha_baja,"
					+ "campania.id_empresa,"
					+ "revenue_carrier,"
					+ "revenue_cliente, "
					+ "tipo  "
					+ "from campania join empresa on empresa.id_empresa = campania.id_empresa "
					+ "where empresa.id_empresa = " + String.valueOf(empresa.getCodigoEmpresa()+" "
							+ "and campania.fecha_alta<CONVERT(datetime, CAST('"+Integer.valueOf(String.valueOf(periodo) + String.valueOf(PrincipalFachade.getInstance().getMaxDia(periodo))) +"' AS CHAR(12)), 112)"
							+ "and (campania.fecha_baja> CONVERT(datetime, CAST('"+Integer.valueOf(String.valueOf(periodo) + String.valueOf(PrincipalFachade.getInstance().getMaxDia(periodo))) +"' AS CHAR(12)), 112)"
									+ "or campania.fecha_baja is null)"));
			
			List<CampaniaBD> campanias = null;
			
			while(rs.next()){
				if( campanias == null )
					campanias = new LinkedList<CampaniaBD>();
				
				CampaniaBD tmpCampaniaBD = new CampaniaBD();
				
				tmpCampaniaBD.setId_campania(rs.getInt("id_campania"));
				tmpCampaniaBD.setDescripcion(rs.getString("Descripcion"));
				tmpCampaniaBD.setFecha_alta(rs.getDate("fecha_alta"));
				tmpCampaniaBD.setFecha_baja(rs.getDate("fecha_baja"));
				tmpCampaniaBD.setEmpresa(PrincipalFachade.getInstance().getiEmpresaFachade().getEmpresaBDyId(rs.getInt("id_empresa")));
				tmpCampaniaBD.setRevenue_carrier(rs.getFloat("revenue_carrier"));
				tmpCampaniaBD.setRevenue_cliente(rs.getFloat("revenue_cliente"));
				tmpCampaniaBD.setTipo(rs.getString("tipo"));
				campanias.add(tmpCampaniaBD);
				}
			return campanias;	
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	public CampaniaBD getCampaniaByName(EmpresaVO evo, String nombreCampania) {
		// TODO Auto-generated method stub
		ResultSet rs = super.getObjectByIdWhereX2("campania", "descripcion", nombreCampania,"id_empresa",evo.getCodigoEmpresa());
		CampaniaBD campaniaBD = null;
		try {
			if(rs.next()){
				
				try {
					campaniaBD = new CampaniaBD();
					campaniaBD.setDescripcion(rs.getString("descripcion"));
					campaniaBD.setEmpresa(new EmpresaDAO().getEmpresaById(rs.getInt("id_empresa")));
					campaniaBD.setFecha_alta(rs.getDate("fecha_alta"));
					campaniaBD.setFecha_baja(rs.getDate("fecha_baja"));
					campaniaBD.setId_campania(rs.getInt("id_campania"));
					campaniaBD.setRevenue_carrier(rs.getFloat("revenue_carrier"));
					campaniaBD.setRevenue_cliente(rs.getFloat("revenue_cliente"));
					campaniaBD.setTipo(rs.getString("tipo"));
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return campaniaBD;
	}

	public List<CampaniaBD> getCampaniasByIdConcepto(int codConcepto,int codEmpresa) throws Exception{
		// TODO Auto-generated method stub
		
		return null;
	}

	public DetalleTraficoVO getDetalleTraficoVO(Integer nroCampania, String descripcionConcepto) throws Exception {
		String query = "select distinct campania.id_campania, campania.descripcion, campania.tipo, p.precio, revenue_carrier, revenue_cliente from solicitud "
				+ "join campania on campania.id_campania = solicitud.id_campania "
				+ "join precio p on p.id_concepto = solicitud.id_concepto "
				+ "where p.fecha_desde in ( "
				+ "	select max(fecha_desde) from precio "
				+ "	join concepto on precio.id_concepto = concepto.id_concepto "
				+ "	where concepto.descripcion = '" + descripcionConcepto + "') and campania.id_campania = " + nroCampania;
		ResultSet rs = super.executeQuery(query);
		try {
			if(rs.next()){
				DetalleTraficoVO detalle = new DetalleTraficoVO();
				detalle.setNombreCampania(rs.getString("descripcion"));
				detalle.setPrecio(rs.getFloat("precio"));
				detalle.setRevenueCarrier(rs.getFloat("revenue_carrier"));
				detalle.setRevenueCliente(rs.getFloat("revenue_cliente"));
				detalle.setTipoCampania(rs.getString("tipo"));
				return detalle;
			}
		} catch (SQLException e) {
			throw new RuntimeException(e.getMessage());
		}
		return null;
	}


	

}
